package test.selenide;

import cn.demoncat.util.lang.RegexpUtil;
import cn.demoncat.util.lang.StringUtil;
import cn.demoncat.util.selenide.SelenideUtil;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideElement;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * 京东查询
 *
 * @author 延晓磊
 * @since 2024年07月09日
 */
public class JdQuery {

    /*
      配置Selenide
     */
    static {
        SelenideUtil.config(20);
        SelenideUtil.firefox("C:/Program Files/Mozilla Firefox/firefox.exe");
    }

    /**
     * 商品信息
     */
    @Data
    public static class Item{

        private String id;
        private String name;
        private String brand;
        private String model;
        // 主图
        private String img;
        // 轮播图
        private String slide;
        // 详情
        private String detail;
    }

    /**
     * 获取图片域名
     *
     * @param url   //img10.360buyimg.com/xxx
     * @return http://img10.360buyimg.com/sku/
     */
    private static String getImgDomain(String url){
        return "https://" + RegexpUtil.search(url, "img.+com").get(0) + "/sku/";
    }

    /**
     * 查询商品详情
     *
     * @param id    商品编码
     * @param imgConvert    图片转换
     * @return
     */
    public static Item getItem(String id, Function<String,String> imgConvert)  {
        Item item = new Item();
        item.setId(id);
        List<String> imgs = new ArrayList<>();
        if (imgConvert == null) {
            imgConvert = s -> s;
        }
        // 请求Html
        Selenide.open("https://item.jd.com/" + id +".html");
        try {
            // 商品名称
            item.setName(StringUtils.trimToEmpty(Selenide.$(".sku-name").text()));
            // 商品属性
            ElementsCollection elements = Selenide.$$(".p-attr-item");
            if (CollectionUtils.isNotEmpty(elements)) {
                for (SelenideElement attr : elements) {
                    if (attr.$(".p-attr-key").text().contains("品牌")) {
                        item.setBrand(StringUtils.trimToEmpty(attr.$(".p-attr-value").text()));
                    }else if (attr.$(".p-attr-key").text().contains("型号")) {
                        item.setModel(StringUtils.trimToEmpty(attr.$(".p-attr-value").text()));
                    }
                }
            }
            // 商品品牌
            SelenideElement element = Selenide.$("#parameter-brand");
            if (element.exists()) {
                item.setBrand(StringUtils.trimToEmpty(element.$("li").attr("title")));
            }
            // 商品图片
            for (SelenideElement img : Selenide.$$(".spec-items img")) {
                imgs.add(imgConvert.apply(getImgDomain(img.attr("src")) + img.attr("data-url")));
            }
            item.setImg(imgs.get(0));
            item.setSlide(StringUtil.join(imgs));
            // 商品详情
            StringBuilder detail = new StringBuilder();
            try {
                // 样式中抽取图片
                element = Selenide.$("#J-detail-content style").should(Condition.exist);
                for (String img : RegexpUtil.search(element.innerHtml(), "//img.+\\)")) {
                    // 抽取图片
                    detail.append("<p>").append("<img src=\"").append(imgConvert.apply("https:" + img.substring(0, img.length()-1))).append("\"/></p>\r\n");
                }
            }catch (Throwable e){
                // 页面中抽取图片
                elements = Selenide.$$("#J-detail-content p img");
                if (CollectionUtils.isNotEmpty(elements)) {
                    for (SelenideElement img : elements) {
                        detail.append("<p>").append("<img src=\"").append(imgConvert.apply(img.getAttribute("data-lazyload"))).append("\"/></p>\r\n");
                    }
                }
            }
            item.setDetail(detail.toString());
        }catch (Throwable e){
            throw new RuntimeException("拉取商品失败：https://item.jd.com/" + id, e);
        }
        return item;
    }

}
